/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package negocio;

import java.net.URL;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 *
 * @author Ing. Agustin Fernandez, Ing. Monica Merlo
 */
@Stateless
public class GestorGeoBean implements GestorGeoRemote, GestorGeoLocal {

    static Logger logger = Logger.getLogger(GestorGeoBean.class);

    public static void log4j(Exception e) {
        URL url = GestorGeoBean.class.getResource("/configuracion/log4j.properties");
        PropertyConfigurator.configure(url);
        logger.error(e);
    }
    @PersistenceContext
    private EntityManager em;

    /***
     * Retorna una lista de las instancias de Localidad cuyo nombre coincida con el
     * valor del parametro nombreLoc.
     * @param nombreLoc
     * @return lista con todas aquellas localidades con nombre como nombreLoc, null en caso contrario
     * interfaz local
     */
    public List encontrarLocalidadesPorNombreConsultaGeo(String nombreLoc) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Localidad.findByNombre");
            q.setParameter("nombre", nombreLoc);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista de las instancias de Localidad cuyo nombre coincida con el
     * valor del parametro nombreLoc.
     * @param nombreLoc
     * @return lista con todas aquellas localidades con nombre como nombreLoc, null en caso contrario
     * interfaz remota
     */
    public List encontrarLocalidadesPorNombreConsultaGeoRemote(String nombreLoc) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Localidad.findByNombre");
            q.setParameter("nombre", nombreLoc);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todas aquellas localidades cuyo nombre y departamento,
     * coincidan con los parametros nombreLoc e idDpto, en caso contrario retornara una
     * lista vacia.
     * @param nombreLoc
     * @param idDpto
     * @return lista con todas las localidades con nombre como nombreLoc e ID departamento
     * igual a idDpto ordenadas por nombre y null en caso contrario
     * interfaz local
     */
    public List encontrarLocalidadesPorNombreYDptoConsultaGeo(String nombreLoc, int idDpto) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Localidad.encontrarPorNombreYdpto");
            q.setParameter("nombre", nombreLoc);
            q.setParameter("idDpto", idDpto);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todas aquellas localidades cuyo nombre y departamento,
     * coincidan con los parametros nombreLoc e idDpto, en caso contrario retornara una
     * lista vacia.
     * @param nombreLoc
     * @param idDpto
     * @return lista con todas las localidades con nombre como nombreLoc e ID departamento igual a idDpto ordenadas por nombre
     * y null en caso contrario
     * interfaz remota
     */
    public List encontrarLocalidadesPorNombreYDptoConsultaGeoRemote(String nombreLoc, int idDpto) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Localidad.encontrarPorNombreYdpto");
            q.setParameter("nombre", nombreLoc);
            q.setParameter("idDpto", idDpto);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todos los objetos de tipo Pais cuyos nombres coincidan
     * con el parametro nombrePais, en caso contrario devolvera una lista vacia.
     * @param nombrePais
     * @return lista con todos los países con nombre igual a nombrePais y null en caso contrario
     * interfaz local
     */
    public List encontrarPaisesPorNombreConsultaGeo(String nombrePais) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Pais.encontrarPorNombre");
            q.setParameter("nombre", nombrePais);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todos los objetos de tipo Pais cuyos nombres coincidan
     * con el parametro nombrePais, en caso contrario devolvera una lista vacia.
     * @param nombrePais
     * @return lista con todos los países con nombre como nombrePais ordenados por nombre y null en caso contrario
     * interfaz remota
     */
    public List encontrarPaisesPorNombreConsultaGeoRemote(String nombrePais) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Pais.encontrarPorNombre");
            q.setParameter("nombre", nombrePais);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todos los objetos de tipo Provincia cuyos nombres coincidan con
     * el parametro nombreProvincia.
     * @param nombreProvincia
     * @return lista con todas las provincias con nombre como nombreProvincia ordenadas y null en caso contrario
     * interfaz local
     */
    public List encontrarProvinciasPorNombreConsultaGeo(String nombreProvincia) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Provincia.encontrarPorNombre");
            q.setParameter("nombre", nombreProvincia);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todos los objetos de tipo Provincia cuyos nombres coincidan con
     * el parametro nombreProvincia.
     * @param nombreProvincia
     * @return lista con todas las provincias con nombre como nombreProvincia ordenadas y null en caso contrario
     * interfaz remota
     */
    public List encontrarProvinciasPorNombreConsultaGeoRemote(String nombreProvincia) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Provincia.encontrarPorNombre");
            q.setParameter("nombre", nombreProvincia);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todos los objetos de tipo Provincia, cuyos nombres coincidan con
     * los parametros nombrePais e idPais, en caso contrario retornara una lista vacia.
     * @param nombreProvincia
     * @param idPais
     * @return lista con todas aquellas provincias con nombre como nombreProvincia y Pais ID igual a idPais
     * ordenadas por nombre y null en caso contrario
     * interfaz local
     */
    public List encontrarProvinciasPorNombreYPaisConsultaGeo(String nombreProvincia, int idPais) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Provincia.encontrarPorNombreYpais");
            q.setParameter("nombre", nombreProvincia);
            q.setParameter("idPais", idPais);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todos los objetos de tipo Provincia, cuyos nombres coincidan con
     * los parametros nombrePais e idPais, en caso contrario retornara una lista vacia.
     * @param nombreProvincia
     * @param idPais
     * @return lista con todas aquellas provincias con nombre como nombreProvincia y Pais ID igual a idPais
     * ordenadas por nombre y null en caso contrario
     * interfaz remota
     */
    public List encontrarProvinciasPorNombreYPaisConsultaGeoRemote(String nombreProvincia, int idPais) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Provincia.encontrarPorNombreYpais");
            q.setParameter("nombre", nombreProvincia);
            q.setParameter("idPais", idPais);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con objetos de tipo Departamento cuyos nombres coincidan con
     * el parametro nombreDepartamento, en caso contrario retornara una lista vacia.
     * @param nombreDepartamento
     * @return lista de departamentos con nombre como nombreDepartamento ordenados por nombre y
     * null en caso contrario
     * interfaz local
     */
    public List encontrarDepartamentosPorNombreConsultaGeo(String nombreDepartamento) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Departamento.encontrarPorNombre");
            q.setParameter("nombre", nombreDepartamento);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con objetos de tipo Departamento cuyos nombres coincidan con
     * el parametro nombreDepartamento, en caso contrario retornara una lista vacia.
     * @param nombreDepartamento
     * @return lista de departamentos con nombre como nombreDepartamento ordenados por nombre y
     * null en caso contrario
     * interfaz remota
     */
    public List encontrarDepartamentosPorNombreConsultaGeoRemote(String nombreDepartamento) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Departamento.encontrarPorNombre");
            q.setParameter("nombre", nombreDepartamento);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con objetos de tipo Departamento cuyos nombres e id de Provincia, coincidan
     * con los parametros nombreDepartamento e idProv respectivamente, retorna Null en caso contrario.
     * @param nombreDepartamento
     * @param idProv
     * @return lista con departamentos con nombre como nombreDepartamento e ID provincia igual a idProv
     * ordenados por nombre
     * interfaz local
     */
    public List encontrarDepartamentosPorNombreYProvinciaConsultaGeo(String nombreDepartamento, int idProv) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Departamento.encontrarPorNombreYprovincia");
            q.setParameter("nombre", nombreDepartamento);
            q.setParameter("idProvincia", idProv);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con objetos de tipo Departamento cuyos nombres e id de Provincia, coincidan
     * con los parametros nombreDepartamento e idProv respectivamente, retorna Null en caso contrario.
     * @param nombreDepartamento
     * @param idProv
     * @return lista con departamentos con nombre como nombreDepartamento e ID provincia igual a idProv
     * ordenados por nombre
     * interfaz remota
     */
    public List encontrarDepartamentosPorNombreYProvinciaConsultaGeoRemote(String nombreDepartamento, int idProv) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Departamento.encontrarPorNombreYprovincia");
            q.setParameter("nombre", nombreDepartamento);
            q.setParameter("idProvincia", idProv);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con objetos de tipo TipoObra cuyos nombres coincidan con
     * el parametro nombreTipoObra, en caso contrario etorna Null.
     * @param nombreTipoObra
     * @return lista con todos los tipos de obra con nombre como nombreTipoObra ordenados por nombre
     * y null en caso contrario
     * interfaz local
     */
    public List encontrarTiposObraConsultaGeo(String nombreTipoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoObra.encontrarPorNombre");
            q.setParameter("nombre", nombreTipoObra);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con objetos de tipo TipoObra cuyos nombres coincidan con
     * el parametro nombreTipoObra, en caso contrario etorna Null.
     * @param nombreTipoObra
     * @return lista con todos los tipos de obra con nombre como nombreTipoObra ordenados por nombre
     * y null en caso contrario
     * interfaz remota
     */
    public List encontrarTiposObraConsultaGeoRemote(String nombreTipoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoObra.encontrarPorNombre");
            q.setParameter("nombre", nombreTipoObra);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con objetos de tipo SubtipoObra cuyos nombres
     * coincidan con el parametro nombreSubtipo, en caso contrario retorna Null.
     * @param nombreSubtipo
     * @return lista con los subtipos de obra con nombre como nombreSubtipo ordenados
     * por nombre y null en caso contrario
     * interfaz local
     */
    public List encontrarSubtiposPorNombreConsultaGeo(String nombreSubtipo) {
        try {
            javax.persistence.Query q = em.createNamedQuery("SubtipoObra.encontrarPorNombre");
            q.setParameter("nombre", nombreSubtipo);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con objetos de tipo SubtipoObra cuyos nombres
     * coincidan con el parametro nombreSubtipo, en caso contrario retorna Null.
     * @param nombreSubtipo
     * @return lista con los subtipos de obra con nombre como nombreSubtipo ordenados
     * por nombre y null en caso contrario
     * interfaz remota
     */
    public List encontrarSubtiposPorNombreConsultaGeoRemote(String nombreSubtipo) {
        try {
            javax.persistence.Query q = em.createNamedQuery("SubtipoObra.encontrarPorNombre");
            q.setParameter("nombre", nombreSubtipo);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con objetos de tipo SubtipoObra cuyos nombres e id
     * coincidan con los parametros nombreSubtipo e idTipoObra respectivamente,
     * en caso contrario retorna Null.
     * @param nombreSubtipo
     * @param idTipoObra
     * @return lista con los subtipos de obra con nombre como nombreSubtipo e ID de tipo de obra igual
     * a idTipoObra oredenados por nombre y null en caso contrario
     * interfaz local
     */
    public List encontrarSubtiposPorNombreYTipoConsultaGeo(String nombreSubtipo, int idTipoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("SubtipoObra.encontrarPorNombreYtipo");
            q.setParameter("nombre", nombreSubtipo);
            q.setParameter("idTipoObra", idTipoObra);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con objetos de tipo SubtipoObra cuyos nombres e id
     * coincidan con los parametros nombreSubtipo e idTipoObra respectivamente,
     * en caso contrario retorna Null.
     * @param nombreSubtipo
     * @param idTipoObra
     * @return lista con los subtipos de obra con nombre como nombreSubtipo e ID de tipo de obra igual
     * a idTipoObra oredenados por nombre y null en caso contrario
     * interfaz remota
     */
    public List encontrarSubtiposPorNombreYTipoConsultaGeoRemote(String nombreSubtipo, int idTipoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("SubtipoObra.encontrarPorNombreYtipo");
            q.setParameter("nombre", nombreSubtipo);
            q.setParameter("idTipoObra", idTipoObra);
            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con objetos de tipo Obra que coincidan con el criterio de búsqueda siguiente: Pais como pais,
     * Provincia como provincia, Departamento como dpto, Localidad como localidad, Tipo de Obra como tipoObra,
     * Subtipo de Obra como subtipoObra, ordenados por nombre y Null en caso contrario.
     * @param pais
     * @param provincia
     * @param dpto
     * @param localidad
     * @param tipoObra
     * @param subtipoObra
     * @return lista con aquellas obras que coincidan con el criterio de búsqueda siguiente: Pais como pais,
     * Provincia como provincia, Departamento como dpto, Localidad como localidad, Tipo de Obra como tipoObra,
     * Subtipo de Obra como subtipoObra, ordenadas por nombre y null en caso contrario
     * interfaz local
     */
    public List filtrarObrasConsultaGeo(String pais, String provincia, String dpto,
            String localidad, String tipoObra, String subtipoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.filtrarObrasConsultaGeo");
            q.setParameter("pais", pais.toUpperCase());
            q.setParameter("provincia", provincia.toUpperCase());
            q.setParameter("dpto", dpto.toUpperCase());
            q.setParameter("localidad", localidad.toUpperCase());
            q.setParameter("tipoObra", tipoObra.toUpperCase());
            q.setParameter("subtipoObra", subtipoObra.toUpperCase());

            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con objetos de tipo Obra que coincidan con el criterio de búsqueda siguiente: Pais como pais,
     * Provincia como provincia, Departamento como dpto, Localidad como localidad, Tipo de Obra como tipoObra,
     * Subtipo de Obra como subtipoObra, ordenados por nombre y Null en caso contrario.
     * @param pais
     * @param provincia
     * @param dpto
     * @param localidad
     * @param tipoObra
     * @param subtipoObra
     * @return lista con aquellas obras que coincidan con el criterio de búsqueda siguiente: Pais como pais,
     * Provincia como provincia, Departamento como dpto, Localidad como localidad, Tipo de Obra como tipoObra,
     * Subtipo de Obra como subtipoObra, ordenadas por nombre y null en caso contrario
     * interfaz remota
     */
    public List filtrarObrasConsultaGeoRemote(String pais, String provincia, String dpto,
            String localidad, String tipoObra, String subtipoObra) {
        try {

            javax.persistence.Query q = em.createNamedQuery("Obra.filtrarObrasConsultaGeo");
            q.setParameter("pais", pais.toUpperCase());
            q.setParameter("provincia", provincia.toUpperCase());
            q.setParameter("dpto", dpto.toUpperCase());
            q.setParameter("localidad", localidad.toUpperCase());
            q.setParameter("tipoObra", tipoObra.toUpperCase());
            q.setParameter("subtipoObra", subtipoObra.toUpperCase());

            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con objetos de tipo Obra que coincidan
     * con el parametro idObra, en caso contrario retornara Null.
     * @param idObra
     * @return lista con obra con ID igual a idObra y null en caso contrario
     * interfaz local
     */
    public List filtrarObrasPorId(int idObra) {
        try {

            javax.persistence.Query q = em.createNamedQuery("Obra.findById");
            q.setParameter("id", idObra);

            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con objetos de tipo Obra que coincidan
     * con el parametro idObra, en caso contrario retornara Null.
     * @param idObra
     * @return lista con obra con ID igual a idObra y null en caso contrario
     * interfaz remota
     */
    public List filtrarObrasPorIdRemote(int idObra) {
        try {

            javax.persistence.Query q = em.createNamedQuery("Obra.findById");
            q.setParameter("id", idObra);

            return q.getResultList();

        } catch (Exception e) {
            GestorGeoBean.log4j(e);
            return null;
        }
    }

    /***
     * 
     * @param object
     */
    public void persist(Object object) {
        em.persist(object);
    }
}
